﻿using Search4.Domain.Entity;
using Search4.Domain.Repository;
using System;
using System.Text;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace Search4.Web.View.Cadastro
{
    public class Perfil : System.Web.UI.Page
    {
        #region CONTROLES
        public ImageButton imbAdicionar { get; set; }
        public Label lblNome { get; set; }
        public Label lblNomeUsuario { get; set; }
        public Label lblEmail { get; set; }
        public Label lblSenha { get; set; }
        public TextBox txbEmail { get; set; }
        public TextBox txbSenha { get; set; }
        public LinkButton lbtRedefinirSenhaEmail { get; set; }
        public Button btnAlterarRegistro { get; set; }
        public Button btnSalvarRegistro { get; set; }
        public HiddenField hdnSequenciaUsuario { get; set; }
        public HiddenField hdnNome { get; set; }
        public HiddenField hdnCPF { get; set; }
        public HiddenField hdnTelefone { get; set; }
        public HiddenField hdnLogradouro { get; set; }
        public HiddenField hdnNumero { get; set; }
        public HiddenField hdnCidade { get; set; }
        public HiddenField hdnCEP { get; set; }
        public HiddenField hdnComplemento { get; set; }
        public HiddenField hdnBairro { get; set; }
        public HiddenField hdnUF { get; set; }
        public Panel pnlEstabelecimentos { get; set; }
        public String IdEstabelecimentoExcluir { get { return Request.QueryString["excluir"]; } }
        #endregion


        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            VerificaSeUsuarioEstaLogado();
            ConfigurarPagina();
            ConsultaUsuario();

            if (!String.IsNullOrEmpty(IdEstabelecimentoExcluir))
            {
                ExcluirEstabelecimento(IdEstabelecimentoExcluir);            
            }
        }

        private void VerificaSeUsuarioEstaLogado()
        {
            var lbtPainel = (LinkButton)Master.FindControl("lbtPainel");
            var lblSeparador = (Label)Master.FindControl("lblSeparador");
            var lbtCadastro = (LinkButton)Master.FindControl("lbtCadastro");
            var lblWelcome = (Label)Master.FindControl("lblWelcome");
            var lbtLogin = (LinkButton)Master.FindControl("lbtLogin");
            var lbtLogout = (LinkButton)Master.FindControl("lbtLogout");
            var usuarioLogado = Session["USUARIO"] != null ? true : false;
            if (usuarioLogado)
            {
                lbtLogin.Visible = false;
                lbtCadastro.Visible = false;
                lbtLogout.Visible = true;
                lblWelcome.Visible = true;
                lbtPainel.Visible = true;
                lblSeparador.Visible = true;
            }
            else
            {
                lbtLogin.Visible = true;
                lbtCadastro.Visible = true;
                lbtLogout.Visible = false;
                lblWelcome.Visible = false;
                lbtPainel.Visible = false;
                lblSeparador.Visible = false;
            }    
        }

        private void ExcluirEstabelecimento(String IdEstabelecimentoExcluir)
        {
            var estabelecimentoRepository = new EstabelecimentoRepository();
            var estabelecimento = estabelecimentoRepository.ObterPeloIdentificador(Convert.ToInt32(IdEstabelecimentoExcluir));
            try
            {
                estabelecimentoRepository.Excluir(estabelecimento);
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "success", "alert('Estabelecimento excluido com sucesso !'); setInterval(function(){location.href='Perfil.aspx';},1000);", true);
            }
            catch
            {
                Page.RegisterStartupScript(",", "<script>alert('Ocorreu um erro na exclusão do estabelecimento.')</script>");
            }
        }

        private void ConfigurarPagina()
        {
            lbtRedefinirSenhaEmail.Click += lbtRedefinirSenhaEmail_Click;
            btnSalvarRegistro.Click += btnSalvarRegistro_Click;
            imbAdicionar.Click += imbAdicionar_Click;
        }

        private void ConsultaUsuario()
        {
            var usuarioRepository = new UsuarioRepository();
            var usuario = usuarioRepository.ObterPeloIdentificador(Convert.ToInt32(Session["USUARIO"]));

            if (usuario != null)
            {
                CarregaPerfil(usuario);
            }
        }


        #region MÉTODOS UTILITÁRIOS
        private void CarregaPerfil(Usuario usuario)
        {
            hdnSequenciaUsuario.Value = usuario.IdUsuario.ToString();
            hdnCPF.Value = usuario.CPF;
            hdnNome.Value = usuario.Nome;
            hdnTelefone.Value = usuario.Telefone;
            hdnLogradouro.Value = usuario.Endereco == null ? String.Empty : usuario.Endereco.IdEndereco.ToString();
            lblNomeUsuario.Text = usuario.Nome;

            var estabelecimentoRepository = new EstabelecimentoRepository();
            var estabelecimentos = estabelecimentoRepository.ObterPeloUsuario(Convert.ToInt32(usuario.IdUsuario));

            if (estabelecimentos != null)
            {
                for (int i = 0; i < estabelecimentos.Count; i++)
                {
                    var codigoEstabelecimento = new HiddenField();
                    codigoEstabelecimento.ID = String.Concat("hdnCodigoEstabelecimento", i);
                    codigoEstabelecimento.Value = estabelecimentos[i].IdEstabelecimento.ToString();

                    var div = new HtmlGenericControl("div");
                    div.ID = String.Concat("divEstabelecimento", i);
                    div.Attributes.Add("style", "margin-left: 10px !important; ");                  

                    var h4 = new HtmlGenericControl("h4");

                    var linkButtonTitulo = new LinkButton();
                    linkButtonTitulo.CssClass = "link-button";
                    linkButtonTitulo.Text = estabelecimentos[i].Nome;
                    linkButtonTitulo.Click += linkButtonTitulo_Click;
                    linkButtonTitulo.CommandArgument = estabelecimentos[i].IdEstabelecimento.ToString();
                    h4.Controls.Add(linkButtonTitulo);

                    var p = new HtmlGenericControl("p");
                    p.InnerText = estabelecimentos[i].Descricao;

                    var divEditar = new HtmlGenericControl("div");
                    divEditar.Attributes.Add("style", "display:inline");
                    var strEditar = new StringBuilder();
                    strEditar.Append(String.Format("<a href='Estabelecimento.aspx?editar={0}' class='link-button'>Editar</a>", estabelecimentos[i].IdEstabelecimento));
                    divEditar.InnerHtml = strEditar.ToString();

                    var labelSeparador = new Label();
                    labelSeparador.Attributes.Add("style", "margin:0px 5px 0px 5px");
                    labelSeparador.Text = "|";
                    
                    var divExcluir = new HtmlGenericControl("div");
                    divExcluir.Attributes.Add("style", "display:inline");
                    var strExcluir = new StringBuilder();
                    strExcluir.Append(String.Format("<a href='Perfil.aspx?excluir={0}' class='link-button'>Excluir</a>", estabelecimentos[i].IdEstabelecimento));
                    divExcluir.InnerHtml = strExcluir.ToString();

                    var br = new HtmlGenericControl("br");
                    
                    div.Controls.Add(h4);
                    div.Controls.Add(p);
                    div.Controls.Add(divEditar);
                    div.Controls.Add(labelSeparador);
                    div.Controls.Add(divExcluir);
                    div.Controls.Add(br);

                    pnlEstabelecimentos.Controls.Add(div); 
                }
            }
            else
            {
                Page.RegisterStartupScript(",", "<script>alert('Sem estabelecimentos cadastrados')</script>");
            }
        }    

        private Usuario PreecherUsuarioComValorDosComponentes()
        {
            var usuario = new Usuario();
            usuario.IdUsuario = Convert.ToInt32(hdnSequenciaUsuario.Value);
            usuario.Nome = hdnNome.Value;
            usuario.CPF = hdnCPF.Value;
            usuario.Email = txbEmail.Text;
            usuario.Telefone = hdnTelefone.Value;
            usuario.Senha = Convert.ToInt32(txbSenha.Text);
            usuario.Endereco = new Endereco();
            usuario.Endereco.IdEndereco = Convert.ToInt32(hdnLogradouro.Value);
            return usuario;
        }
        #endregion


        #region MÉTODOS DE AÇÃO
        void btnSalvarRegistro_Click(object sender, EventArgs e)
        {
            var usuario = PreecherUsuarioComValorDosComponentes();

            var usuarioRepository = new UsuarioRepository();
            usuarioRepository.Salvar(usuario);

            Session.Remove("USUARIO");
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "success", "alert('Email e senha alterados com sucesso !'); setInterval(function(){location.href='Login.aspx';},1000);", true);
        }

        void lbtRedefinirSenhaEmail_Click(object sender, EventArgs e)
        {
            txbEmail.Visible = true;
            txbSenha.Visible = true;
            btnSalvarRegistro.Visible = true;
        }

        void imbAdicionar_Click(object sender, ImageClickEventArgs e)
        {
            Response.Redirect("/Cadastro/Estabelecimento.aspx");
        }

        void linkButtonTitulo_Click(object sender, EventArgs e)
        {
            var btn = (LinkButton)(sender);
            Response.Redirect(String.Concat("/Paginas/Detalhe.aspx?e=", btn.CommandArgument));
        }  
        #endregion
    }
}
